var place = {

	all : function() {
		this.view.createMenuItens();
	},

	index : function() {

	},

	command : function() {
		place.index();
	}
};

var espiar = {
	all : function() {
		this.view.createMenuItens();
	},

	index : function() {
		var distancia = int(load("distSpy"));
		coord = villageCoord;
		Utils.getAldeias(function(minhasAldeias) {
			getAlvos(distancia, minhasAldeias, function(aldeias) {
				espiar.view.showContadores();
				espiar.view.showQteAldeias(aldeias.length);
				espiar.view.showLinkAtk(function() {
					espiar.enviarSpys(aldeias,espiar.view.actions);
				});
				//espiar.view.showAldeias(aldeias);
			});
		});
	},

	enviarSpys : function(aldeias,actions) {
		estado("Aguarde...");
		Utils.getAldeias(function(minhasAldeias) {
			var qte = 0;
			minhasAldeias.map(function(minhaAldeia) {
				getSpys(minhaAldeia.id, function(tropas) {
					minhaAldeia.spy = tropas.spy;
					qte++;
					if (qte == minhasAldeias.length) {
						selecionaAlvos(minhasAldeias, aldeias)
					}
				});
			});
	
			selecionaAlvos = function(myAldeias, alvos) {
				// pega aldeias que ja estao sendo atacadas
				pegaJaAtacadas = function(myAldeias, complete) {
					var qte = 0;
					myAldeias.map(function(aldeia) {
								ajax({
									url : url('place', aldeia.id),
									load : function(page) {
										aldeia.jaEstaAtacando = $(
												'img[src*="attack.png"]',
												page)
												.parent()
												.toArray()
												.map(
														function(a) {
															return new Coord(
																	$(a)
																			.html()
																			.match(
																					/...\|.../)[0]);
														})
										qte++;
										if (qte == myAldeias.length) {
											complete(myAldeias)
										}
									}
								})
							})
				}
	
				pegaJaAtacadas(
						myAldeias,
						function(minhasAldeias) {
							
							var ataquesAcontecendo = minhasAldeias
									.map(function(a) {
										return a.jaEstaAtacando;
									});
	
							var msg = "Voce tem "+alvos.length+" alvos possivels ";
							var aux = alvos.length;
							alvos = alvos
									.map(function(a) {
										for ( var int = 0; int < ataquesAcontecendo.length; int++) {
											if (ataquesAcontecendo[int]
													.equals(a.coord)) {
												return null;
											}
										}
										return a;
									})
							msg += "mas ja esta atacando "+(aux-alvos.length)+" vou espiar os outros "+alvos.length;
							estado(msg)
							var combinacoes = alvos.map(function(alvo) {
								return myAldeias.map(function(myAld) {
									var combinado = {}
									combinado.aldeia = myAld;
									combinado.alvo = alvo;
									combinado.distancia = myAld.coord
											.distancia(alvo.coord);
									return combinado;
								})
							})
	
							combinacoes.ordena(function(a, b) {
								return a.distancia > b.distancia;
							})
	
							var ataque = null;
							while (ataque = combinacoes.shift()) {
								if (ataque.aldeia.spy != 0) {
									actions.initAtk();
									ataque.aldeia.spy--;
									combinacoes = combinacoes.map(function(a) {
												if (a.alvo.coord
														.equals(ataque.alvo.coord))
													return null;
												return a;
									})
									
									Utils.sendAtk(ataque.alvo.coord, ataque.aldeia.id, {spy:1}, actions);
									
								}
							}
	
						})

					}

				});
	},

	config : function() {
		container.append(new Form().label("Distancia de espionagem").textField(
				"distSpy").label("Quantidade de spys").textField("qteSpys")
				.label("Quantidade de pontos maxima").textField("ptosMax")
				.label("Level maximo da muralha").textField("wallLevelMax")
				.make());

		
	}

};

var atacar = {
	all : function() {
		this.view.createMenuItens();
	},
	index : function() {
		atacar.getRelatorios(function(relatorios) {
			atacar.view.showContadores();
			atacar.view.showQteRelatorios(relatorios.length);
			atacar.view.showLinkAtk(function() {
				atacar.sendAtks(relatorios, atacar.view.actions);
			});
		});
	},
	sendAtks : function(relatorios,actions) {
		Utils.getAldeias(function(aldeias) {
			function getInfos(complete) {
				var qte = 0;
				aldeias.map(function(aldeia) {
					getSpys(aldeia.id, function(tropas) {
						aldeia.tropas = tropas;
						qte++;
						if (qte == aldeias.length)
							complete(aldeias, relatorios)
					})
				})
			}
			
			getInfos(function(aldeias,relatorios){
				var combinacoes = relatorios.map(function(relatorio) {
					return aldeias.map(function(aldeia) {
						var combinado = {}
						combinado.aldeia = aldeia;
						combinado.alvo = relatorio;
						combinado.distancia = aldeia.coord
								.distancia(relatorio.coord);
						return combinado;
					})
				})

				combinacoes.ordena(function(a, b) {
					return a.distancia > b.distancia;
				})
				var aux = 0;
				var ataque = null;
				while (ataque = combinacoes.shift()) {
					
					
						var tropas = ataque.aldeia.tropas;
						var recursos = clone(ataque.alvo.recursos);
						var tropasParaAtacar = {};	
						var salvaTropas = clone(tropas);
						for ( var i in prioridades) {
							if (!$.isFunction(prioridades[i])){
								x = prioridades[i];
								tropasParaAtacar[x] = 0;
								var carga = Soldados[x].carga;
								var qte = int(tropas[x]);
	
								while (qte != 0 && recursos > 0
										&& carga != 0) {
									tropasParaAtacar[x]++;
									recursos -= carga;
									qte--;
								}
	
								// adicionar 1 spy na parada
								if (x == 'spy' && tropas[x] > 0) {
									tropasParaAtacar.spy = 1;
									qte--;
								}
								
								if (x == 'ram' && tropas[x] >= destroyWall(ataque.alvo.muralha) && false) {
									tropasParaAtacar.ram = destroyWall(ataque.alvo.muralha);
									qte--;
								}
	
								tropas[x] = qte;
							}
						}
						
						if (vaiAtacar(ataque.alvo.recursos - recursos,ataque,false)){
							actions.initAtk();

							combinacoes = combinacoes.map(function(a) {
								
								if (a.alvo.coord
										.equals(ataque.alvo.coord)){
									return null;
								}
								return a;
							})
							
							Utils.sendAtk(ataque.alvo.coord, 
							ataque.aldeia.id, tropasParaAtacar,actions,
							ataque.alvo.reportId);
						}else if (recursos <= 1){
							if ((ataque.alvo.recursos - recursos,ataque,true)){
								actions.initAtk();
								actions.sucesso(null,ataque.alvo.reportId);
								
								combinacoes = combinacoes.map(function(a) {
									
									if (a.alvo.coord
											.equals(ataque.alvo.coord)){
										return null;
									}
									return a;
								})
							}
							tropas = clone(salvaTropas);
						} else {
							tropas = clone(salvaTropas);
						}
				} 
				
			})

		})
	},
	getRelatorios : function(complete){
		getQteRelatorios = function(complete) {
			ajax({
				url : url('report',village,'mode=attack'),
				load : function(page){
					var paginador = $('td[align="center"][colspan="3"]:first',page);
					if (paginador.length == 1){
						var aux = $('td[align="center"][colspan="3"]:first',page).html().match(/\[\d+\]/g);
						var qte = aux == null ? 1 : aux[aux.length-1].replace('[','').replace(']','');
						complete(qte);
					} else {
						complete(1);
					}

				}
			})
		};
		
		getPageRelatorioURL = function(number,complete){
			ajax({
				url : url('report',village,'mode=attack&from='+number*12),
				load : function(page){
					
					complete($('span[id*=labelText]',page).parent().toArray().map(function(a){ return $(a).attr('href')}))
				}
			})
		}
		
		getQteRelatorios(function(qte){
			var qteAjax = 0;
			var todasUrls = [];
			for(var i=0;i<qte;i++){
				getPageRelatorioURL(i,function(urlRelatorios){
					todasUrls = todasUrls.concat(urlRelatorios);
					qteAjax++;
					if (qteAjax == qte){
						getAllRelatorios(todasUrls);
					}
				})
			}
			
		})
		
		getAllRelatorios = function(urls){
			
			var relatorios = [];
			var qte = 0;
			urls.map(function(url){
				ajax({
					url : url,
					load : function(page){
						hReport = $('.vis',page).eq(2).html().match(/h=....&/g)[0].replace('h=','').replace('&','')
						var spyInfo = $('#attack_spy',page);
						if (spyInfo.length > 0){
						
							var relatorio = {};
							// pega recursos
							relatorio.recursos = 0;
							var auxRecursos = $('#attack_spy td:eq(0)',page).html().match(/>\d+(<span class="grey">.<\/span>\d+)*/g);
							
							if (auxRecursos != null)
							auxRecursos.map(function(a){
								relatorio.recursos += int(a.replace('<span class="grey">.</span>','').replace('>',''));
							})
							// muralha
							relatorio.muralha = -1;
							if ($('#attack_spy td:eq(1)',page).length > 0) {
								relatorio.muralha = 0;
								var aux2 = $('#attack_spy td:eq(1)',
										page).html().match(
										/Muralha.+\d+/);
								if (aux2 != null)
									relatorio.muralha = int(aux2[ 0 ]
											.match(/\d+/)[0]);
							}
							
							// tropas
							var unidadesName = $(
									"#attack_info_def_units", page)
									.html().match(/_[a-z]*/g);
							var unidadesQte = $(
									"#attack_info_def_units tr:eq(1)",
									page).html()
									.match(/>[0-9.]+/g);

							var tropas = new Object();
							unidadesName.map(function(a, i) {
								a = a.replace('_', '');
								tropas[a] = int(unidadesQte[i]
										.replace('>', ''));
							});		
							
							// tropas fora da aldeia
							var tropasFora = {};
							if ($('#attack_spy tr:eq(3)',page).length == 1){
								var aux = $('#attack_spy tr:eq(3)',page).eq(0);
								
								var unidadesName2 = aux
										.html().match(/_[a-z]*/g);
								var unidadesQte2 = aux.html()
										.match(/>[0-9.]+/g);

								tropasFora = new Object();
								unidadesName2.map(function(a, i) {
									a = a.replace('_', '');
									tropasFora[a] = int(unidadesQte2[i]
											.replace('>', ''));
								});	
								
							}
							
							
							// coordenada
							var stringCoord = $('#labelText', page)
							.html().match(
									/\d{3}\|\d{3}/g)[0];
							relatorio.coord = new Coord(stringCoord);
							// report id
							relatorio.reportId = this.url.match(/\d+/g)[1],
							// alvo id
							relatorio.aldeiaId = $(
									"a:contains(" + stringCoord
											+ ")", page).attr(
									'href').match(/\d+/g)[1],
							relatorio.tropas = tropas;
							relatorio.tropasFora = tropasFora;
							relatorios.push(relatorio);
						} else {
//							var relatorio = {};
//							var stringCoord = $('#labelText', page)
//							.html().match(
//									/\d{3}\|\d{3}/g)[0];
//							relatorio.coord = new Coord(stringCoord);
//							// report id
//							relatorio.reportId = this.url.match(/\d+/g)[1],
//							// alvo id
//							relatorio.aldeiaId = $(
//									"a:contains(" + stringCoord
//											+ ")", page).attr(
//									'href').match(/\d+/g)[1],
//							
//							relatorio.recursos = 0;
//							relatorio.tropas = {spear:1000};
//							relatorio.tropasFora = {spear:1000};
//							relatorios.push(relatorio);
						}
						
						qte++;
						if (qte == urls.length)
							complete(relatorios);	
					}
				})
			})
			

		}

	}
};

var Utils = {
	parametrosSend : null,
	h : null,
	sendAtk : function(destino, origem, tropas, act, reportid) {
		if (this.parametrosSend == null) {
			var getConfig = {
				coord : destino.x + "|" + destino.y,
				origem : origem,
				method : 'POST',
				url : url('place', origem, 'command', 'try=confirm'),
				parametros : $(destino).parametro({
					attack : 'true'
				}, tropas),
				load : function(cont) {
					var valoresDoForm = $("form input", cont);
					var formatado = new Object();
					valoresDoForm.map(function(b, a) {
						if ($(a).attr('value') != 'OK')
							formatado[$(a).attr('name')] = $(a).attr('value');
					});

					Utils.parametrosSend = $(formatado).parametro();
					Utils.h = $('form:last', cont).attr('action');// cont.match(/h=[a-z-0-9]+/g)[1];
					Utils.sendAtk(destino, origem, tropas, act, reportid);
				}
			};
			ajax(getConfig);
		} else {
			var enviaAtk = {
				url : Utils.h,
				parametros : Utils.parametrosSend,
				method : "POST",
				load : function(c) {
					
					var ataques = $('img[src*=attack]', c).parent().find(
							'span[id*=Text]:contains(' + destino.x + '|'
									+ destino.y + ')').toArray().length;

					if (ataques == 0) {
						var erro = $("#error", c);
						erro = $("#error", c).html();
						try{
							if (erro.indexOf("compartilham a mesma conex") != -1) {
								act.erro(destino, "<b>Compartilhamento!</b>");
								return;
							}else act.erro(destino, erro);
						}catch (e) {
							
						}
						
						Utils.parametrosSend = null;
						Utils.sendAtk(destino, origem, tropas, act, reportid);
					} else if (ataques == 1) {
						act.sucesso(destino, reportid);
					}
				}
			};
			ajax(enviaAtk);

		}

	},
	getAldeias : function(complete) {

		ajax({
			url : url("overview_villages",village,"mode=combined"),
			load : function(l) {

				var premiumContainer = $('#combined_table  td:contains("|")', l);
				
				if (premiumContainer.length > 0)
					myAldeias = premiumContainer
				else
					myAldeias = $('#production_table td:contains("|")',l);
				
				myAldeias = myAldeias.toArray().map(
							function(a) {
								var ret = {};
								a = $(a).html();
								ret.coord = new Coord(
										a.match("...\\|...")[0]);
								ret.id = a.match("village=\\d+")[0]
										.replace('village=', '');
								
								return ret;
							})
				complete(myAldeias);
				
			}
		})

	}
};

function getSpys(village, complete) {
	ajax({
		url : url('place', 'command', "village=" + village),
		load : function(r) {
			var units = (r.match(/#unit_input.*\"/g));
			var result = new Object();
			units.map(function(z) {
				var unit = {};
				unit.qte = int(z.match(/\d+/g));
				unit.name = z.match(/[a-z]+/g).pop();
				result[unit.name] = unit.qte;
			});
			complete(result);
		}
	});
}

function getAlvos(distancia, centro, complete) {
	function geraUrlParaAjax(centroMatriz, diagonal) {
		// posicao 1x1 da matriz, para calcular as outras
		var pos1x1 = new Coord(centroMatriz.x - 20 * diagonal, centroMatriz.y
				- 20 * diagonal);
		var listaDeCarregamentosParaAjax = [];

		var qteDeQuadros = Math.pow(diagonal * 2 + 1, 2);

		var aux = Math.sqrt(qteDeQuadros);
		for ( var i = 0; i < aux; i++) {
			for ( var j = 0; j < aux; j++) {
				listaDeCarregamentosParaAjax.push(new Coord(pos1x1.x + 20 * i,
						pos1x1.y + 20 * j));
			}
		}
		// string com as coordenadas para o ajax
		return listaDeCarregamentosParaAjax.map(function(a) {
			return a.x + "_" + a.y;
		});
	}

	function calculaDiagonal(distancia) {
		// distancia do centro a ponta de 1 quadro
		var dist1Quadro = 21.213203435596427;

		// tamanho da diagonal do quadrado a ser explorado em quadros
		var diagonal = Math.floor(distancia / dist1Quadro);
		return diagonal;
	}
	var myAldeias = centro.map(function(a) {
		return new Coord(a.coord.x, a.coord.y);
	})

	var minhasAldeias = centro;
	var listasUrl = minhasAldeias.map(function(centro) {
		var diagonal = calculaDiagonal(distancia);

		// pega o centro dessa matriz ainda baseando na coordenada passada
		centro.coord.x -= 15;
		centro.coord.y -= 15;

		// arredondar para multiplo de 20
		var centroMatriz = new Coord();
		centroMatriz.x = Math.round((centro.coord.x) / 20) * 20;
		centroMatriz.y = Math.round((centro.coord.y) / 20) * 20;
		return geraUrlParaAjax(centroMatriz, diagonal);
	})

	listaUrl = listasUrl.unique(function(a) {
		return a
	}).join('&');

	ajax({
		url : "http://br39.tribalwars.com.br/map.php?" + listaUrl,
		load : function(r) {
			var alds = [];
			var perimetro = eval(r);
			for ( var iAldl = 0; iAldl < perimetro.length; iAldl++) {
				var dados = perimetro[iAldl];
				var base = new Coord(dados.x, dados.y);
				var aldeias = dados.data.villages;
				var jogadores = dados.data.players;
				var tribos = dados.data.allies;
				jogadores[0] = [ "barbaro", "1", 0, "barbaro" ];
				tribos[0] = [ "Sem tribo", "Sem tribo", "Sem tribo" ];

				// varre todas linhas de aldeias, que 'e o deslocamento em x
				for ( var index in aldeias) {
					// varre todas aldeias da linha
					for ( var index2 in aldeias[index]) {

						// brutos
						var toAldeia = aldeias[index][index2];
						var toJogador = jogadores[toAldeia[4]];
						var toTribo = tribos[toJogador[2]];

						var coordenada = new Coord(int(base.x) + int(index),
								int(base.y) + int(index2));
						var tribo = new Tribo(toTribo[0], toTribo[1],
								toTribo[2], toJogador[2]);
						var jogador = new Jogador(toJogador[0], toJogador[1],
								toAldeia[4], tribo, toJogador[3]);
						var aldeia = new Aldeia(coordenada, jogador,
								toAldeia[0], toAldeia[2], toAldeia[3],
								toAldeia[5]);

						var meusPontos = int(meusDados.player.points);

						var razao = meusPontos / int(aldeia.jogador.pontos.match(/\d/g).join(""));

						if(filtraAlvos(razao,aldeia,meusDados)){
							var distancias = myAldeias.map(function(a) {
								return aldeia.coord.distancia(a);
							})

							for ( var i = 0; i < distancias.length; i++) {
								if (distancias[i] <= distancia) {
									alds.push(aldeia);
									break;
								}
							}
						}
						
					}
				}
			}
			complete(alds);
		}
	});
}

var info_village = {
	index : function() {
		this.addItemMenu('Fazer uma reserva pela aldeia', url('info_village',
				'action=reserve_village&id=' + id));

	},
	addItemMenu : function(titulo, url) {
		var caracterLegal = $('td[colspan=2] > a').eq(0).html()[0];
		titulo = caracterLegal + ' ' + titulo;
		$('td[colspan=2] > a').parent().parent().parent().append(
				'<tr><td colspan="2"><a href="' + url + '&h=' + hScreen + '">'
						+ titulo + '</a></td></tr>')
	}
}
